package com.browsesoft.htmlcomponent;

import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.w3c.dom.Element;

/**
 * 代表一个按钮，用户按下该按钮后，将通知某个对象执行某个方法，对象类型名 组件的元素上标记，要执行的方法名在action隐藏域中标记 classname
 * 类名
 */
public class ActionButtonModel implements HTMLFormModel {
	/**
	 * 对应的组件
	 */
	private HTMLBasicComponent component = null;

	/**
	 * 动作
	 */
	private String action = null;

	/**
	 * 更新属性
	 * 
	 * @param ht
	 *            存储属性的哈息表
	 */
	public void updateAttributes(Hashtable ht) {
		try {
			// 得到要处理动作的对象
			String className = this.component.getElement().getAttribute(
					"classname");
			Class c = Class.forName(className);
			Object obj = c.newInstance();
			// 得到动作方法
			Class[] classes = { Class.forName("java.util.Map") };
			Method method = c.getDeclaredMethod(this.action, classes);
			// 执行动作方法
			Object[] objs = { ht };
			method.invoke(obj, objs);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 得到属性
	 * 
	 * @return 存储属性的哈息表
	 */
	public Hashtable getAttributes() throws Exception {
		return new Hashtable();
	}

	/**
	 * 得到选择列表
	 * 
	 * @param name
	 *            名字
	 * @return 列表
	 */
	public Iterator getOptions(String name) throws Exception {
		return new LinkedList().iterator();
	}

	/**
	 * 初始化model
	 */
	public void init(HttpServletRequest request) throws Exception {
	}

	/**
	 * 处理用户请求
	 * 
	 * @param request
	 *            客户端请求
	 */
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		// 得到动作
		this.action = request.getParameter("action");
	}

	/**
	 * 设置模型所对应的组件
	 * 
	 * @param component
	 *            对应的组件
	 */
	public void setComponent(HTMLBasicComponent component) {
		this.component = component;
	}

	/**
	 * 由Component决定需要Model处理的元素内容，在Component的updateElement()方法中调用
	 */
	public void updatePageElement(HTMLBasicComponent c) throws Exception {
		if (this.action != null) {
			Element e = (Element) c.getPage().getDocument()
					.getElementsByTagName("body").item(0);
			e.setAttribute("onload", "alert('提交成功!');window.close();");
		}
	}
}